package com.umessage.hotel.util;

import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
import java.util.TreeMap;

import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;

import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;

public class XmlTool {

	/**
	 * String 转 org.dom4j.Document
	 * 
	 * @param xml
	 * @return
	 * @throws DocumentException
	 */
	public static Document strToDocument(String xml) throws DocumentException {
		return DocumentHelper.parseText(xml);
	}

	/**
	 * org.dom4j.Document 转 com.alibaba.fastjson.JSONObject
	 * 
	 * @param xml
	 * @return
	 * @throws DocumentException
	 */
	public static JSONObject documentToJSONObject(String xml) throws DocumentException {
		return elementToJSONObject(strToDocument(xml).getRootElement());
	}

	/**
	 * org.dom4j.Element 转 com.alibaba.fastjson.JSONObject
	 * 
	 * @param node
	 * @return
	 */
	@SuppressWarnings("unchecked")
	public static JSONObject elementToJSONObject(Element node) {
		JSONObject result = new JSONObject();
		// 当前节点的名称、文本内容和属性
		List<Attribute> listAttr = node.attributes();// 当前节点的所有属性的list
		for (Attribute attr : listAttr) {// 遍历当前节点的所有属性
			result.put(attr.getName(), attr.getValue());
		}
		// 递归遍历当前节点所有的子节点
		List<Element> listElement = node.elements();// 所有一级子节点的list
		if (!listElement.isEmpty()) {
			for (Element e : listElement) {// 遍历所有一级子节点
				if (e.attributes().isEmpty() && e.elements().isEmpty()) // 判断一级节点是否有属性和子节点
					result.put(e.getName(), e.getTextTrim());// 沒有则将当前节点作为上级节点的属性对待
				else {
					if (!result.containsKey(e.getName())) // 判断父节点是否存在该一级节点名称的属性
						result.put(e.getName(), new JSONArray());// 没有则创建
					((JSONArray) result.get(e.getName())).add(elementToJSONObject(e));// 将该一级节点放入该节点名称的属性对应的值中
				}
			}
		}
		return result;
	}

	/**
	 * json对象转map
	 * @param jsonObj
	 * @param resultMap
	 */
	public static void JsonToMap(JSONObject jsonObj, Map<String, Object> resultMap) {

		Set<Entry<String, Object>> entrySet = jsonObj.entrySet();
		for (Entry<String, Object> entry : entrySet) {
			String key = (String) entry.getKey();
			Object value = entry.getValue();

			if (value instanceof JSONObject) {
				// 递归遍历
				JsonToMap((JSONObject) value, resultMap);
			} else {
				resultMap.put(key, value);
			}
		}
	}
	
	
	public static void main(String[] args) {
		
		JSONObject json = new JSONObject();
		JSONObject children = new JSONObject();
		children.put("child_id", "ddddd");
		
		json.put("id", "12333");
		json.put("children", children);
		
		Map<String, Object> resultMap = new TreeMap<String, Object>();
		XmlTool.JsonToMap(json, resultMap);
		
		System.out.println(resultMap);
	}

}